package co.gov.medellin.sdep.sisdep.integration.backingbean;

import java.util.List;

import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;

import co.gov.medellin.sdep.sisdep.common.AppConstants;
import co.gov.medellin.sdep.sisdep.domain.BaseController;
import co.gov.medellin.sdep.sisdep.domain.MessageModalWindowController;
import co.gov.medellin.sdep.sisdep.integration.apisub.APISUBClient;
import co.gov.medellin.sdep.sisdep.integration.catastro.CatastroWSClient;
import co.gov.medellin.sdep.sisdep.integration.outlook.OutlookMeetingClient;
import co.gov.medellin.sdep.sisdep.integration.sapbapirentws.ContribuyenteSAPData;
import co.gov.medellin.sdep.sisdep.integration.sapbapirentws.SAPRentasWSClient;
import co.gov.medellin.sdep.sisdep.integration.theta.ThetaClient;

/**
 * Controlador que permite consultar y presentar al usuario la informacion asociada con los derechos
 * y pendientes que pueda tener un solicitante con alguna entidad de la Alcaldia de Medellin.
 * 
 * @author carlos.perez@consult-soft.com
 * @version 04/05/2012
 */
public class IntegrationController extends BaseController implements java.io.Serializable {
		
	/** Serial key. */
	private static final long serialVersionUID = -11889878654600426L;

	/** Objeto contenedor del listado objetos contrato de SAP Rentas asociado con una persona . */
	private transient DataModel saldoRentasListModel;

	/** Objeto contenedor del listado de contravenciones asociado con una persona. */
	private transient DataModel contravencionesListModel;
	
	/** Objeto contenedor del listado de beneficios asociado con una persona. */
	private transient DataModel beneficiosListModel;

	/** Objeto contenedor del listado de propiedades raiz asociado con una persona. */
	private transient DataModel propiedadesListModel;

	/** Objeto que almacena la informacion de un contribuyente relacionado con la Alcaldia de Medellin */
	private ContribuyenteSAPData contribuyenteTO;
	
	/** Objeto cliente para el manejo las solicitudes de consulta al Servicio WEB de SAP Rentas de la Alcaldia de Medellin. */
	private SAPRentasWSClient sapRentasWSClient;

	/** Objeto cliente para el manejo las solicitudes de consulta al Sistema THETA de la Alcaldia de Medellin. */
	private ThetaClient thetaClient;

	/** Objeto cliente para el manejo las solicitudes de consulta al Sistema SUB de la Alcaldia de Medellin. */
	private APISUBClient subClient;

	/** Objeto cliente para el manejo las solicitudes de consulta al Sistema CATASTRO de la Alcaldia de Medellin. */
	private CatastroWSClient catastroWSClient;
	
	/** PRUEBA DE ENVIO OUTLOOK */
	private OutlookMeetingClient outlookMeetingClient;

	/** Tipo de documento de identificacion de la persona a validar. */
	private String documentType;

	/** Numero del documento de identificacion de la persona a validar. */
	private String documentID;
		
	/**
	 * Contructor para inicializar los elementos asociados con las consultas
	 */
	public IntegrationController() {
		saldoRentasListModel = new ListDataModel();
		contravencionesListModel = new ListDataModel();
		beneficiosListModel = new ListDataModel();
		propiedadesListModel = new ListDataModel();
	}
	
	/**
	 * @return the saldoRentasListModel
	 */
	public DataModel getSaldoRentasListModel() {
		return saldoRentasListModel;
	}

	/**
	 * @param saldoRentasListModel the saldoRentasListModel to set
	 */
	public void setSaldoRentasListModel(DataModel saldoRentasListModel) {
		this.saldoRentasListModel = saldoRentasListModel;
	}

	/**
	 * @return the contribuyenteTO
	 */
	public ContribuyenteSAPData getContribuyenteTO() {
		if (null == this.contribuyenteTO) {
			this.contribuyenteTO = new ContribuyenteSAPData();
		}
		return contribuyenteTO;
	}

	/**
	 * @param contribuyenteTO the contribuyenteTO to set
	 */
	public void setContribuyenteTO(ContribuyenteSAPData contribuyenteTO) {
		this.contribuyenteTO = contribuyenteTO;
	}	
	
	/**
	 * Metodo que verifica la existencia de un contribuyente en el Sistema SAP Rentas de la Alcaldia de Medellin.
	 * Lo que indica que la persona tiene o ha tenido alguna relacion con ella. E inicializa el listado de objetos
	 * contratos asociados con el contribuyente identificado.
	 * 
	 * @author carlos.perez@consult-soft.com
	 * @version 04/05/2012
	 *
	 * @return String view redireccionada
	 */
	public String ckeckSAPRentas() {
		
		setContribuyenteTO(sapRentasWSClient.getContribuyenteSAPData(documentID));
		getSaldoRentasListModel().setWrappedData(sapRentasWSClient.getSaldoContribuyenteSAPList(documentID));
		
		if(getSaldoRentasListModel().getWrappedData() == null) {
			((MessageModalWindowController) getBean(AppConstants.MESSAGE_CONTROLLER_BEAN))
            .setSuccessMessage("- NO se obtuvo informaci\u00F3n en RENTAS para: " + documentID, null, null);
		} else {
			if(((List)getSaldoRentasListModel().getWrappedData()).isEmpty()) {
				((MessageModalWindowController) getBean(AppConstants.MESSAGE_CONTROLLER_BEAN))
	            .setSuccessMessage("- NO se obtuvo informaci\u00F3n en RENTAS para: " + documentID, null, null);
			}
		}
		return ""; // No cambia de Vista en la JSF
	}
	
	/**
	 * Metodo que permite consultar el listado de contravenciones registradas para un ciudadano en el sistema
	 * THETA de la Alcaldia de Medellin.
	 * 
	 * @author carlos.perez@consult-soft.com
	 * @version 30/05/2012
	 *
	 * @return vista redireccionada
	 */
	public String ckeckThetaContravenciones() {
		
		getContravencionesListModel().setWrappedData(thetaClient.loadContravencionesThetaByDocID(documentID));
		
		if(getContravencionesListModel().getWrappedData() == null) {
			((MessageModalWindowController) getBean(AppConstants.MESSAGE_CONTROLLER_BEAN))
            .setSuccessMessage("- NO se obtuvo informaci\u00F3n de Contravenciones (THETA) para: " + documentID, null, null);
		} else {
			if(((List)getContravencionesListModel().getWrappedData()).isEmpty()) {
				((MessageModalWindowController) getBean(AppConstants.MESSAGE_CONTROLLER_BEAN))
	            .setSuccessMessage("- NO se obtuvo informaci\u00F3n de Contravenciones (THETA) para: " + documentID, null, null);
			}
		}
		return ""; // No cambia de Vista en la JSF
	}
	
	/**
	 * Metodo que permite consultar el listado de beneficios sociales registradas para 
	 * un ciudadano en el Sistema SUB de la Alcaldia de Medellin.
	 * 
	 * @author carlos.perez@consult-soft.com
	 * @version 30/05/2012
	 *
	 * @return vista redireccionada
	 */
	public String checkSUBBeneficios() {
		
		getBeneficiosListModel().setWrappedData(subClient.loadBeneficiosSUBByDocID(documentID));
		
		if(getBeneficiosListModel().getWrappedData() == null) {
			((MessageModalWindowController) getBean(AppConstants.MESSAGE_CONTROLLER_BEAN))
            .setSuccessMessage("- NO se obtuvo informaci\u00F3n de Beneficios (SUB) para: " + documentID, null, null);
		} else {
			if(((List)getBeneficiosListModel().getWrappedData()).isEmpty()) {
				((MessageModalWindowController) getBean(AppConstants.MESSAGE_CONTROLLER_BEAN))
	            .setSuccessMessage("- NO se obtuvo informaci\u00F3n de Beneficios (SUB) para: " + documentID, null, null);
			}
		}
		// Prueba de envio de email al outlook con un evento:
		/* try {
			outlookMeetingClient.send(); 
		} catch(Exception e) {
			System.err.println("SISDEP::outlookMeetingClient-->SEND ERROR:" + e.getStackTrace());
		}*/
		
		return ""; // No cambia de Vista en la JSF
	}
	
	/**
	 * Metodo que permite consultar el listado de beneficios sociales registradas para 
	 * un ciudadano en el Sistema SUB de la Alcaldia de Medellin.
	 * 
	 * @author carlos.perez@consult-soft.com
	 * @version 30/05/2012
	 *
	 * @return vista redireccionada
	 */
	public String checkCatastroPropiedades() {
		
		getPropiedadesListModel().setWrappedData(catastroWSClient.loadCatastroDataByDocID(documentID));
		
		if(getPropiedadesListModel().getWrappedData() == null) {
			((MessageModalWindowController) getBean(AppConstants.MESSAGE_CONTROLLER_BEAN))
            .setSuccessMessage("- NO se obtuvo informaci\u00F3n de Propiedades (CATASTRO) para: " + documentID, null, null);
		} else {
			if(((List)getPropiedadesListModel().getWrappedData()).isEmpty()) {
				((MessageModalWindowController) getBean(AppConstants.MESSAGE_CONTROLLER_BEAN))
	            .setSuccessMessage("- NO se obtuvo informaci\u00F3n de Propiedades (CATASTRO) para: " + documentID, null, null);
			}
		}
		return ""; // No cambia de Vista en la JSF
	}
		
	/**
	 * Metodo que apoya la verficacion de la FOTO-instantanea (snapshot) del comerciante
	 * 
	 * @author carlos.perez@consult-soft.com
	 * @version 15/06/2012
	 * 
	 * @return 
	 */
	public String checkSnapshot() {
		return ""; // No cambia de Vista en la JSF
	}
	
	/**
	 * Metodo utilizado para limpiar los listados de items luego de ejecutar una nueva
	 * consulta de interfaces.
	 * 
	 * @author carlos.perez@consult-soft.com
	 * @version 06/06/2012
	 *
	 * @return String view redireccionada 
	 */
	public String resetListModel() {
		setDocumentID(""); // Limpia el documento de la consulta.
		
		List tempList = (List)getSaldoRentasListModel().getWrappedData();
		if(tempList != null) {
			tempList.clear();
		}
		tempList = (List)getContravencionesListModel().getWrappedData();
		if(tempList != null) {
			tempList.clear();
		}
		tempList = (List)getBeneficiosListModel().getWrappedData();
		if(tempList != null) {
			tempList.clear();
		}
		tempList = (List)getPropiedadesListModel().getWrappedData();
		if(tempList != null) {
			tempList.clear();
		}
		return ""; // No cambia de Vista en la JSF		
	}
	
	/**
	 * @return the sapRentasWSClient
	 */
	public SAPRentasWSClient getSapRentasWSClient() {
		return sapRentasWSClient;
	}

	/**
	 * @param sapRentasWSClient the sapRentasWSClient to set
	 */
	public void setSapRentasWSClient(SAPRentasWSClient sapRentasWSClient) {
		this.sapRentasWSClient = sapRentasWSClient;
	}

	/**
	 * @return the documentID
	 */
	public String getDocumentID() {
		return documentID;
	}

	/**
	 * @param documentID the documentID to set
	 */
	public void setDocumentID(String documentID) {
		this.documentID = documentID;
	}

	/**
	 * @return the contravencionesListModel
	 */
	public DataModel getContravencionesListModel() {
		return contravencionesListModel;
	}

	/**
	 * @param contravencionesListModel the contravencionesListModel to set
	 */
	public void setContravencionesListModel(DataModel contravencionesListModel) {
		this.contravencionesListModel = contravencionesListModel;
	}

	/**
	 * @return the thetaClient
	 */
	public ThetaClient getThetaClient() {
		return thetaClient;
	}

	/**
	 * @param thetaClient the thetaClient to set
	 */
	public void setThetaClient(ThetaClient thetaClient) {
		this.thetaClient = thetaClient;
	}

	/**
	 * @return the beneficiosListModel
	 */
	public DataModel getBeneficiosListModel() {
		return beneficiosListModel;
	}

	/**
	 * @param beneficiosListModel the beneficiosListModel to set
	 */
	public void setBeneficiosListModel(DataModel beneficiosListModel) {
		this.beneficiosListModel = beneficiosListModel;
	}

	/**
	 * @return the subClient
	 */
	public APISUBClient getSubClient() {
		return subClient;
	}

	/**
	 * @param subClient the subClient to set
	 */
	public void setSubClient(APISUBClient subClient) {
		this.subClient = subClient;
	}

	/**
	 * @return the propiedadesListModel
	 */
	public DataModel getPropiedadesListModel() {
		return propiedadesListModel;
	}

	/**
	 * @param propiedadesListModel the propiedadesListModel to set
	 */
	public void setPropiedadesListModel(DataModel propiedadesListModel) {
		this.propiedadesListModel = propiedadesListModel;
	}

	/**
	 * @return the catastroWSClient
	 */
	public CatastroWSClient getCatastroWSClient() {
		return catastroWSClient;
	}

	/**
	 * @param catastroWSClient the catastroWSClient to set
	 */
	public void setCatastroWSClient(CatastroWSClient catastroWSClient) {
		this.catastroWSClient = catastroWSClient;
	}
	/**
	 * @return
	 */
	public String getDocumentType() {
		return documentType;
	}

	/**
	 * @param string
	 */
	public void setDocumentType(String dType) {
		documentType = dType;
	}

	/**
	 * @return
	 */
	public OutlookMeetingClient getOutlookMeetingClient() {
		return outlookMeetingClient;
	}

	/**
	 * @param client
	 */
	public void setOutlookMeetingClient(OutlookMeetingClient client) {
		outlookMeetingClient = client;
	}

}
